package com.giCompiler.business;

import java.io.File;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import com.giCompiler.bean.CodigoFonte;
import com.giCompiler.bean.Projeto;
import com.giCompiler.bean.Usuario;
import com.giCompiler.bean.VinculoUsuarioProjeto;
import com.giCompiler.exception.BusinessException;
import com.giCompiler.dao.CodigoFonteDao;
import com.giCompiler.dao.PacoteDao;
import com.giCompiler.dao.ProjetoDao;
import com.giCompiler.dao.UsuarioDao;
import com.giCompiler.dao.VinculoUsuarioProjetoDao;



public class ManterUsuarioBusiness {

	//Caminho do Ismael
	//private final static String caminhoDiretorioProjetos = "C:\\Documents and Settings\\usuario\\workspace\\giCompiler\\WebContent\\Projetos\\";
	
	//Caminho do Ismael - Servidor
	private final static String caminhoDiretorioProjetos = "C:\\Program Files\\Apache Software Foundation\\Tomcat 6.0\\webapps\\giCompiler\\Projetos\\";
	
	//Caminho do Geovane
	//private final static String caminhoDiretorioProjetos = "";
	
	public List<Usuario> listarUsuariosBusiness(){
		
		return new UsuarioDao().listar();
		
	}
	
	public void cadastrarUsuarioBusiness(Usuario usuario) throws BusinessException{ 
		
		usuario.setDataCriacao(pegarDataAtual());
		usuario.setDataModificacao(pegarDataAtual());
        
        if(existeEmailUsuario(usuario) == false){
        	new UsuarioDao().inserir(usuario); 
		}else{
			System.out.println("Erro no cadastro! O email já está em uso.");
			throw new BusinessException("Erro no cadastro! O email já está em uso.");
		}
         
	} 
	
	public void editarUsuarioBusiness(Usuario usuario){ 
		
		usuario.setDataModificacao(pegarDataAtual());
       	new UsuarioDao().alterar(usuario);  
         
	} 
 
	public void excluirUsuarioBusiness(Usuario usuario){ 
        
		List<VinculoUsuarioProjeto> vups = new ArrayList<VinculoUsuarioProjeto>();
		List<CodigoFonte> cfs = new ArrayList<CodigoFonte>();
		List<Projeto> pjs = new ArrayList<Projeto>();
		UsuarioDao udDao = new UsuarioDao(); 
		ProjetoDao pdDao = new ProjetoDao();
		CodigoFonteDao cfDao = new CodigoFonteDao();
		PacoteDao pDao = new PacoteDao();
		VinculoUsuarioProjetoDao vupDao = new VinculoUsuarioProjetoDao();
		Projeto projeto = new Projeto();
		
		vups = vupDao.pegarProjetosUsuario(usuario.getIdUsuario()); 
		
		//Busca codigos fontes
		for(VinculoUsuarioProjeto vup : vups){
			cfs = cfDao.pegarCodigoFontesDoProjeto(vup.getIdProjeto());
		
			//Deleta codigos fonte
			for(CodigoFonte cf: cfs)
				new CodigoFonteDao().excluir(cf);
		
		}
		
		//Deleta pacotes
		for(VinculoUsuarioProjeto vup : vups)
			pDao.excluirPacotesDoProjeto(vup.getIdProjeto());
		
		//Exclui Projeto
		for(VinculoUsuarioProjeto vup : vups){			
			pjs = pdDao.pegarProjeto(vup.getIdProjeto());
			if(!pjs.isEmpty())
				excluirDiretorioProjeto(pjs.get(0).getNome());
			projeto.setIdProjeto(vup.getIdProjeto());
			pdDao.excluir(projeto);
		}
		//Exclui vinculo de usuario/projeto pelos projetos
		for(VinculoUsuarioProjeto vup : vups)
			vupDao.excluirVupDoProjeto(vup.getIdProjeto());
		
		//Excluir vinculo de usuario/projeto pelos usuarios
		vupDao.excluirVupDoUsuario(usuario.getIdUsuario());
		
		//Excluir Usuario
		udDao.excluir(usuario); 
         
	} 
 
	public List<Usuario> pesquisarUsuarioBusiness(String dados, String filtro){ 
         		
		List<Usuario> usuarios;
		UsuarioDao usuarioDao = new UsuarioDao();
		
		int tipo = 0;//Inteiro
		
		if(filtro.equals("nome") == true)
			tipo = 1;//String
		else if(filtro.equals("email") == true)
			tipo = 1;//String
		else if(filtro.equals("pais") == true)
			tipo = 1;//String
		else if(filtro.equals("dataCriacao") == true)
			tipo = 2;//Data
		else if(filtro.equals("dataModificacao") == true)
			tipo = 2;//Data
		
		if(dados == null || dados.trim().equals(""))
			usuarios = null;
		else
			usuarios = usuarioDao.pesquisar(dados, filtro, tipo);
		
		return usuarios;         
         
	} 
	
	public boolean existeEmailUsuario(Usuario usuario){
		
		List <Usuario> usuarios = new ArrayList <Usuario>();
		UsuarioDao usuarioDao = new UsuarioDao();
				
		usuarios = usuarioDao.procurarUsuarioPorEmail(usuario.getEmail());
		
		if(usuarios.isEmpty() == true)
			return false;/*Não existe o email cadastrado no banco de dados*/
		else
			return true;/*Existe o email cadastrado no banco de dados*/	
				
	}
	
	//Inicia processo de excluir todos os diretorio do projeto
	public boolean excluirDiretorioProjeto(String nomeProjeto){

		File dirProjeto = new File(caminhoDiretorioProjetos+nomeProjeto);
		return excluirArquivosESubDiretorios(dirProjeto);

	}
	
	//Exclui todos os arquivos e subdiretorios de um determinado diretorio
	public boolean excluirArquivosESubDiretorios(File dirProjeto){
				
		if (dirProjeto.isDirectory()) {
			String[] filho = dirProjeto.list();
		    for (int i=0; i<filho.length; i++) {
		        boolean sucesso = excluirArquivosESubDiretorios(new File(dirProjeto, filho[i]));
		        if (!sucesso) {
		            return false;
		        }
		    }
		}

		//O diretorio esta limpo então e deletado
		return dirProjeto.delete();
		
	}
	
	public Date pegarDataAtual(){
		
		return new Date(System.currentTimeMillis());
		
	}
}